
package Model;

import Controller.Controller;
import com.google.api.client.googleapis.media.MediaHttpDownloader;
import com.google.api.client.http.GenericUrl;
import com.google.api.services.drive.Drive;
import com.google.api.services.drive.model.File;
import java.io.FileOutputStream;
import java.io.IOException;

 /**
  * Klasa odpowiedzialna za wielowątkowe ściąganie plików.
  * @param model - referencja na model
  * @param drive - referencja na połączenie z dyskiem google
  * @param DOWNLOAD_PATH - scieżka do katalogu, gdzie będą zapisane pliki
  * @param filename - nazwa pliku do pobrania
  * @param controller - referencja na kontroler.
  */
  public class Download extends Thread {

    private Model model;
    private Drive drive;
    private String DOWNLOAD_PATH;
    private String filename;
    private Controller controller;
    /**
    * @param model - referencja na model
    * @param drive - referencja na połączenie z dyskiem google
    * @param filename - nazwa pliku do pobrania
    * @param controller - referencja na kontroler.
    */
    public Download(Model model,Drive drive,String filename,Controller controller) {
        this.model = model;
        this.drive = drive;
        this.DOWNLOAD_PATH = model.GetDownloadPath();
        this.filename = filename;
        this.controller = controller;
    }
    @Override
    public void run () {
        try {
            downloadFile(filename);
        }
        catch(IOException | NullPointerException e) {
            throw new RuntimeException("Błąd w trakcie pobierania pliku: "+filename);
        }        
    }
    /**
     * Pobiera plik z dysku google i zapisuje go na dysk.
     * @param filename nazwa pliku do pobrania
     * @throws IOException 
     * @throws NullPointerException 
     */
    public void downloadFile(String filename) throws IOException, NullPointerException {
        String fileId = model.GetFileID(filename);
        File file = drive.files().get(fileId).execute();
        Drive.Files.Get get = drive.files().get(fileId);
        FileOutputStream output;
        if (file.getDownloadUrl() != null && file.getDownloadUrl().length() > 0) {
            output = new FileOutputStream (DOWNLOAD_PATH + System.getProperty("file.separator") + filename);

            MediaHttpDownloader downloader = get.getMediaHttpDownloader();
            downloader.setDirectDownloadEnabled(false);
            downloader.setChunkSize(model.getChunkSize());
            downloader.setProgressListener(new FileDownloadProgressListener(controller,filename));
            downloader.download(new GenericUrl(file.getDownloadUrl()), output);
            output.close();
        }
    } 


}
